﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MMessaging.MessagingEx.Services;

namespace MMessaging.MessagingEx.Common
{
	/// <summary>
	/// Abstrakte Basisklasse für alle Plug-Ins für MMessaging-Services.
	/// Die abgeleitete Klasse muss die abstrakte Methode OnMessage implementieren.
	/// </summary>
	/// <typeparam name="MESSAGETYPE"></typeparam>
	public abstract class MServicePlugInBase<MESSAGETYPE> : IMServicePlugIn<MESSAGETYPE>
		where MESSAGETYPE : class
	{
		/// <summary>
		/// Service, dessen Messages dieses Plug-In erhält
		/// </summary>
		protected MServiceBase<MESSAGETYPE> Service { get; set; }
		/// <summary>
		/// Delegate, der die Message versendet.
		/// </summary>
		protected Action<MESSAGETYPE> PostMessageFunc { get; set; }

		protected bool IsCanceling
		{
			get
			{
				return Service.IsCanceling;
			}
		}
 


		/// <summary>
		/// Registriert das Plug-In beim Service in derart, dass es über eintreffende
		/// Messages informiert wird.
		/// </summary>
		/// <param name="service">
		/// Service, den dieses Plug-In um zusätzliche Funktionalität erweitert.
		/// </param>
		/// <param name="postMessageFunc">
		/// Delegate, der aufgerufen wird, wenn das Plug-In eine Message senden will.
		/// Muss diese Message versenden.
		/// </param>
		public virtual void InitPlugIn(
			MServiceBase<MESSAGETYPE> service,
			Action<MESSAGETYPE> postMessageFunc)
		{
			PostMessageFunc = postMessageFunc;
			Service = service;
			service.AddMessageHandler(OnMessage);
		}

		/// <summary>
		/// Wird aufgerufen, wenn der Service eine Message empfängt.
		/// </summary>
		/// <param name="obj"></param>
		protected abstract void OnMessage(IMTask<MESSAGETYPE> obj);
	}
}
